from django.contrib import admin
from django.contrib.admin.models import LogEntry

from django.urls import reverse
from django.utils.html import format_html

from .adminforms import PostAdminForm
from .models import Post,Category,Tag
from typeidea.base_admin import BaseOwnerAdmin
from typeidea.custom_site import custom_site
# Register your models here.

class PostInline(admin.TabularInline):# TabularInline 横向 /   StackedInline 纵向   样式不同
    #作用：在同一页面编辑关联数据  可在分类页面编辑文章
 
    fields=('title','desc')
    extra=1 #控制额外多几个
    model=Post

#admin.site.register(Category)#这种方式会在后台展示对象
@admin.register(Category,site=custom_site)#这种方式会在后台直接使用form展示，不用单独写form
class CategoryAdmin(BaseOwnerAdmin):

    inlines=[PostInline]#作用：在同一页面编辑关联数据  可在分类页面编辑文章 对应上面的 class PostInline(admin.TabularInline):

    list_display=('name','status','is_nav','created_time','post_count')
    fields=('name','status','is_nav')

    def post_count(self,obj):
        return obj.post_set.count()
    post_count.short_description='文章数量'



    # def save_model(self, request, obj, form, change):
    #     obj.owner=request.user
    #     return super(CategoryAdmin,self).save_model(request,obj,form,change)

class CategoryOwnerFilter(admin.SimpleListFilter):
    ##自定义过滤器 只展示当前用户分类
    
    title='分类过滤器'
    parameter_name='owner_category'

    def lookups(self, request, model_admin):
        return Category.objects.filter(owner=request.user).values_list('id','name')

    def queryset(self, request, queryset):
        category_id=self.value()
        if category_id:
            return queryset.filter(category_id=category_id)
        return queryset
    ## 通过继承Django admin 提供的SimpleListFilter类来实现自定义过滤器
    ## 之后只要把自定义过滤器配置到ModelAdmin中即可。
    ## 
    ## 代码解释：SimpleListFilter类 提供了两个属性和两个方法来提供重写
    ## title用来展示标题，parameter_name就是查询时URL参数的名字，比如
    ## 分类id为1的内容时，URL后面的Quer部分是?owner_category=1，此时   
    ## 我们过滤器拿到这个id从而进行过滤
    ## 
    ## lookups:返回要展示的内容和查询用的id（就是上面Quer用的）
    ## queryset:根据 URL Quer 的内容返回列表页数据。比如如果URL最后的Quer
    ## 是?owner_category=1，那么这里拿到的self.value()就是1，此时就会根据
    ## 1来过滤QuerySet （这部分在第五章讲过）。这里的QuerySets 是列表页所有
    ## 展示数据的集合，即post的数据集。
    ## 编写完之后，需要修改list_filter为：
    ## list_filter=[CategoryOwnerFilter]

 

#admin.site.register(Tag)
@admin.register(Tag,site=custom_site)
class TagAdmin(BaseOwnerAdmin):
    list_display=('name','status','created_time')
    fields=('name','status')

    # def save_model(self, request, obj, form, change):
    #     obj.owner=request.user
    #     return super(TagAdmin,self).save_model(request,obj,form,change)


#@admin.register(Post)
@admin.register(Post,site=custom_site)
class PostAdmin(BaseOwnerAdmin):
    form=PostAdminForm

    exclude=('owner',)#不展示的字段
    list_display=[
        'title','category','status',
        'created_time','operator','pv','uv'
    ]
    list_display_links=[]

    #list_filter=['category',]
    list_filter=[CategoryOwnerFilter]
    

    search_fields=['title','category__name']

    actions_on_top=True
    actions_on_bottom=True

    #编辑页面
    save_on_top=True

    exclude=['w=owner']
    # # fields 配置有两个作用，一个是限定要展示的字段，另一个就是配置展示字段的顺序
    # fields=(
    #     ('category','title'),
    #     'desc',
    #     'status',
    #     'content',
    #     'tag'
    # )
    
    ## fieldsets 用来控制页面布局，下面代码为示例，替换上面的fields
    fieldsets=(
        ('基础配置',{
            'description':'基础配置描述',
            'fields':(
                ('title','category'),
                'status',
            ),
        }),

        ('内容',{
            'fields':(
                'desc',
                'content',
            ),
        }),
        
        ('额外信息',{
            'classes':('collapse',),
            'fields':('tag',),
        }),
        ('访问统计',{
            'classes':('collapse',),
            'fields':(
                'pv',
                'uv',
            ),
        }),
    )
    filter_horizontal=('tag',)#横向展示标签
    #filter_vertical=('tag',)#纵向展示标签


    # # fieldsets用来控制布局，要求的格式是有两个元素的tuple的list，如：
    # # 
    # # fieldsets=(
    # #     (名称,{内容}),
    # #     (名称,{内容}),
    # # )
    # # 
    # # 其中包含两个元素的tuple内容，第一个元素的当前板块的名称，第二个元素是当前板块的描述、
    # # 字段和样式配置。也就是说，第一个元素是string，第二个元素的dict，而dict的key可以是
    # # 'fields'、'descritption'和'classes'
    # # 
    # # 
    # # 
    # # 


    def operator(self,obj):
        return format_html(
            '<a href="{}">编辑</a>',
            #reverse('admin:blog_post_change',args=(obj.id,))
            reverse('cus_admin:blog_post_change',args=(obj.id,))
        )
    operator.short_description='操作'

    # def save_model(self, request, obj, form, change):
    #     obj.owner=request.user
    #     return super(PostAdmin,self).save_model(request,obj,form,change)

    # def get_queryset(self, request):
    #     qs=super(PostAdmin,self).get_queryset(request)
    #     return qs.filter(owner=request.user)



    # class Media:
    #     css={
    #         'all':('https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/css/bootstrap.min.css',),
    #     }
    #     js=('https://cdn.bootcss.com/bootstrap/4.0.0-beta.2/js/bootstrap.bundle.js',)

    ##上下这两个css和js有问题，会导致 【删除】 按钮文字显示不全 和 【额外信息】 项目不显示

    # class Media:
    #     css={
    #         'all':('https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/css/bootstrap.min.css',),
    #     }
    #     js=('https://stackpath.bootstrapcdn.com/bootstrap/4.5.0/js/bootstrap.bundle.min.js',)

@admin.register(LogEntry,site=custom_site)

class LogEntryAdmin(admin.ModelAdmin):
    list_display=['object_repr','object_id','action_flag','user','change_message']